The current personal and commercial computing environment is largely dominated by the use of a very few software systems, at the operating system (OS) level (e.g. Microsoft, Linux, Unix, etc.), application level (such as application suites such as Microsoft Office and the like) and Internet access level (such as browsers and web servers like those provided by Netscape, Microsoft, etc.). Such software systems are generally supplied by the software provider as a package on some form of storage medium, including each of the components and installation software which, when run on the customer's computing equipment, installs the various components on its hard disk for future use. The individual components included in each package is generally identical to like components on other packages provided by the same software provider to other customers, with the result that all of the software provider's customers are provided with identical implementations of each software component.
Unfortunately, software “bugs” are an inevitable occurrence in most, if not all, implementations of any software component. The adverse effects of such bugs vary in severity, but all are generally capable of causing faults and malfunctions within the associated software component, and some can leave the software component vulnerable to external attack, which is clearly undesirable. In view of the fact that every customer's version of a particular software component is identical, each version of that software component will include the same bugs as all of the others. As a result, large scale attacks on software systems are successful because computer hackers and the like make the (correct) assumption that most, if not all, of the targeted operating systems or software applications are built in exactly the same way and, as such, have the same bugs and problems associated therewith. Similarly, a major fault or malfunction caused by a bug in the software system will affect all consumers and users thereof in the same way.
One known way of overcoming, or at least reducing, the above-mentioned problems is to provide an operating system or application, in which each of the software components is implemented in a plurality of different ways, and the different implementations of the components are run in parallel, usually on different machines. A voting mechanism is used as the basis for this approach, in which the correct result for an operation is the one achieved by the majority of software implementations performing the operation. However, this approach is very expensive, both in terms of software development (in the sense that different software providers are generally employed to provide each different implementation of a piece of software) and resources, and is therefore usually only used in very specific and critical contexts, such as the software running in nuclear power stations, aircraft, spacecraft, etc.
We have now devised an arrangement which seeks to alleviate the above-mentioned problems.